package com.tgy.programmer_code_interview_guide._02_linkedList;

/**
 * @Author: tgy @Date: 1/22/21 1:56 PM
 *
 * 给定链表的头节点head、整数a和b,实现删除位于a/b处节点的函数。
 * 例如: 链表: 1->2->3->4->5， 假设a/b的值为r。
 * 如果r等于0,不删除任何节点:
 * 如果r在区间(0, 1/5]上，删除节点1;
 * 如果r在区间(1/5, 2/5]上，删除节点2;
 * 如果r在区间(2/5, 3/5]上，删除节点3;
 * 如果r在区间(3/5,4/5]上，删除节点4;
 * 如果r在区间(4/5, 1]上，删除节点5;
 * 如果r大于1,不删除任何节点。
 */
public class _03_删除链表ab处的节点 {

    public static Node removeAB(Node node,int a, int b) {

        int len = 0;

        if (b * a <= 0) {

            return node;
        }

        double r = (a * 1.0) / b;

        if (r > 1.0) {

            return node;
        }
        Node tmpNode = node;
        while (tmpNode != null) {

            len++;
            tmpNode = tmpNode.next;
        }

        if (len == 0) {

            return node;
        }


        int index = (int) Math.ceil(r * len);

        Node dummyNode = new Node();
        dummyNode.next = node;

        Node preNode = dummyNode;

        while (index > 1) {

            preNode = preNode.next;
            index--;
        }

        preNode.next = preNode.next.next;
        return dummyNode.next;
    }

      public static void main(String[] args) {
        //
          Node root = new Node(1);
          root.next = new Node(2);
          root.next.next = new Node(3);
          root.next.next.next = new Node(4);
          root.next.next.next.next = new Node(5);

          root = removeAB(root,3,5);

          Nodes.printNode(root);
      }
}
